import { IpcMainInvokeEvent } from 'electron'

/**
 * 生成主线程 IPC 通信 handle 事件监听器的处理函数
 *
 * @param {(...args: any[]) => any} fun 事件的实际处理函数
 * @param thisArg 指定函数调用时的 this 指向，默认为 null，即非严格模式下函数调用时的 this
 * 指向全局对象，严格模式下为 thisArg 指定的值；对于需要节流处理的函数为箭头函数时，该参数无效，
 * 箭头函数的 this 指向由函数定义时确定，不受 thisArg 参数影响，箭头函数的 this 来源于箭头函
 * 数定义时的上级作用域。
 * @returns {(evt: Electron.CrossProcessExports.IpcMainInvokeEvent, ...args: any[]) => any}
 * 主线程 IPC 通信 handle 事件监听器的处理函数
 */
export const genMainIpcHandleListener = (
  fun: (...args: any[]) => any,
  thisArg: any = null
): ((evt: IpcMainInvokeEvent, ...args: any[]) => any) => {
  return (evt: IpcMainInvokeEvent, ...args: any[]): any => {
    return fun.apply(thisArg, args)
  }
}

export type GenMainIpcHandleListenerType = typeof genMainIpcHandleListener
